# -*- coding: UTF-8 -*-
from contextlib import asynccontextmanager

from fastapi import FastAPI

from dispatcher.routers import logger


@asynccontextmanager
async def app_context(app):
    """
    用于管理脚本资源，在程序出现异常时能安全的关闭脚本
    :param app:
    :return:
    """
    assert isinstance(app, FastAPI), '参数app必须是一个FastAPI类型'
    for middleware in app.router.on_startup:
        await middleware()

    try:
        yield app
    finally:
        for func in app.router.on_shutdown:
            await func()


@asynccontextmanager
async def catch_exception(e: Exception):
    """
    创建一个上下文管理的try...excetpion块
    这里的logger应该是一个像是sentry一样的日志处理模块，而且这里方法也不应该只是一个装饰器，而应该是一个去阿奴的中间件
    # todo 但是这样全局捕获异常的话，会不会出现异常无法定位的问题？
    :param e: 捕获这样一个异常对象
    :return:
    """
    try:
        yield e
    except Exception as e:
        logger.handle(e)

